package coreCron

import (
	"gitee.com/igolang/imoney/internal/core/logger"
	"gitee.com/igolang/pkg/xcron"
)

var instance = &cronService{}

type cronService struct {
	cron *xcron.Cron
}

func Service() *cronService {
	return instance
}

func (c *cronService) Init() error {
	c.cron = xcron.New(&cronLogger{})
	c.cron.Start()
	logger.Log().Debug("cron service start.")
	return nil
}

func (c *cronService) Shutdown() error {
	c.cron.Stop()
	logger.Log().Debug("cron service stop.")
	return nil
}

func (c *cronService) Name() string {
	return "cron service"
}

// Add 将任务加入到调度器
func Add(spec string, job xcron.Job) (*xcron.Entry, error) {
	return instance.cron.AddJob(spec, job)
}

// AddFunc 将任务加入到调度器
func AddFunc(spec string, cmd func(), key, name, desc string) (*xcron.Entry, error) {
	return instance.cron.AddFunc(spec, cmd, key, name, desc)
}

// Remove 将任务从调度器中删除
func Remove(key string) {
	instance.cron.Remove(key)
}

// List 列出调度器中的任务列表
func List() []*xcron.Entry {
	return instance.cron.Entries()
}

// Get 从调度器中获取任务实体
func Get(key string) *xcron.Entry {
	return instance.cron.Entry(key)
}

// Reset 重置调度器中的任务
func Reset(spec string, job xcron.Job) (*xcron.Entry, error) {
	en := Get(job.Key())
	var err error
	if en == nil || en.ID == 0 {
		en, err = Add(spec, job)
	} else {
		Remove(job.Key())
		en, err = Add(spec, job)
	}

	if err != nil {
		return nil, err
	}
	return en, nil
}
